package com.aizuda.boot.modules.file.service;

import com.aizuda.boot.modules.business.contract.dto.SingleResponse;
import com.aizuda.boot.modules.business.contract.dto.UserInfo;
import com.aizuda.boot.modules.file.domain.entity.FileInfo;
import com.aizuda.boot.modules.file.domain.vo.FileDownloadVO;
import com.aizuda.boot.modules.file.domain.vo.FileUploadVO;
import com.aizuda.boot.modules.file.domain.vo.FileVO;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.multipart.MultipartFile;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.util.List;

/**
 * 文件信息服务接口
 *
 * @author yangshen
 * @date 2025-06-19
 */
public interface IFileInfoService extends IService<FileInfo> {

    /**
     * 文件上传服务
     *
     * @param file        上传的文件
     * @param folderType  文件夹类型
     * @param currentUser 当前用户
     * @return 文件上传结果
     */
    SingleResponse<FileUploadVO> fileUpload(MultipartFile file, Integer folderType, UserInfo currentUser);

    /**
     * 文件上传服务
     *
     * @param sourceUrl   远程文件
     * @param folderType  文件夹类型
     * @param currentUser 当前用户
     * @return 文件上传结果
     */
    SingleResponse<FileUploadVO> fileUpload(String sourceUrl, Integer folderType, UserInfo currentUser);

    /**
     * 文件上传
     *
     * @param multipartFile 上传的文件
     * @param path          文件路径
     * @return 文件上传结果
     */
    SingleResponse<FileUploadVO> upload(MultipartFile multipartFile, String path);

    /**
     * 生成fileUrl地址
     *
     * @param filePath 文件路径
     * @return 文件URL
     */
    String generateFileUrl(String filePath);

    /**
     * 根据文件绝对路径 获取文件URL
     * 支持单个 key 逗号分隔的形式
     *
     * @param fileKeys 文件key，支持逗号分隔多个
     * @return 文件URL
     */
    SingleResponse<String> getFileUrl(String fileKeys);

    /**
     * 文件下载
     *
     * @param fileKey   文件key
     * @param userAgent 用户代理
     * @return 文件下载信息
     */
    SingleResponse<FileDownloadVO> getDownloadFile(String fileKey, String userAgent);

    /**
     * 根据文件id 获取文件信息
     *
     * @param fileId 文件ID
     * @return 文件信息
     */
    SingleResponse<FileVO> getFileInfoById(String fileId);

    /**
     * 复制文件
     * 用于模板文件复制场景，避免原文件被修改
     *
     * @param sourceFileId 源文件ID
     * @param folderType   目标文件夹类型
     * @param currentUser  当前用户
     * @return 新文件信息
     */
    SingleResponse<FileUploadVO> copyFile(String sourceFileId, Integer folderType, UserInfo currentUser);

    /**
     * 获取文件名称
     * @param ids
     * @return
     */
    List<String> getFileNamesByIds(List<Long> ids);

    /**
     * 合同文件下载：根据fileId和指定格式下载
     * @param fileId 文件ID
     * @param format 下载格式，docx或pdf
     * @param request HTTP请求
     * @param response HTTP响应
     * @throws IOException IO异常
     */
    void downloadContractByFileId(String fileId, String format, HttpServletRequest request, HttpServletResponse response) throws IOException;

    /**
     * 合同文件下载：根据fileKey和指定格式下载
     * @param fileKey 文件Key
     * @param format 下载格式，docx或pdf
     * @param request HTTP请求
     * @param response HTTP响应
     * @throws IOException IO异常
     */
    void downloadContractByFileKey(String fileKey, String format, HttpServletRequest request, HttpServletResponse response) throws IOException;

    /**
     * 批量文件下载：根据fileKey列表打包下载
     * @param fileKeys 文件Key列表
     * @param request HTTP请求
     * @param response HTTP响应
     * @throws IOException IO异常
     */
    void batchDownloadFiles(List<String> fileKeys, HttpServletRequest request, HttpServletResponse response) throws IOException;
}